# Other issue ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- # What should I do if the device becomes excessively hot? ## Confirm whether the temperature is actually too high Run the following command to obtain the current device temperature: ```bash qpi-config dump temperature ``` If the temperature exceeds 80 °C, take cooling measures immediately. ## Identify the heat source Check CPU utilization and frequency: ```bash # Check CPU utilization. top -b -n 1 | head -20 # Check the operating frequency of each CPU core to determine whether it remains at the maximum frequency. cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq # Check whether the performance governor is enabled. cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor ``` Check GPU utilization: ```bash cat /sys/class/kgsl/kgsl-3d0/gpu_busy_percentage 2>/dev/null cat /sys/class/kgsl/kgsl-3d0/max_gpuclk 2>/dev/null ``` Check storage utilization: ```bash iostat -x 1 3 # Display %util. ``` ## Software cooling measures Reduce the maximum CPU frequency: ```bash # Display available frequencies. cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies # Set the maximum frequency, for example, to 1.6 GHz. echo 1651200 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq ``` Switch the CPU governor to `schedutil`: ```bash echo schedutil > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor ``` Reduce the maximum GPU frequency: ```bash # Display available frequencies. cat /sys/class/kgsl/kgsl-3d0/devfreq/available_frequencies # Set the maximum frequency, for example, to 550 MHz. echo 550000000 > /sys/class/kgsl/kgsl-3d0/devfreq/max_freq ``` Check for processes with abnormal CPU usage: ```bash ps aux --sort=-%cpu | head -10 ``` ## Physical cooling measures - Place the development board in a well-ventilated environment. - Install an active cooling module. The fan should increase its speed automatically when the device temperature exceeds the configured threshold. # What should I do if a library does not work correctly? ## Identify and classify the issue - Link error: The compiler reports *cannot find -lxxx*, or the error *cannot open shared object file* occurs at runtime. - Runtime crash: The application reports *undefined symbol: xxx* or triggers a *Segmentation fault*. - Functional error: The library loads successfully, but a specific API does not respond or returns an unexpected error code. ## Check whether the library file exists and verify the library search path ```bash # 1. Locate the library. find /usr/lib /usr/local/lib /lib -name "libxxx.so*" # 2. Check whether the dynamic linker recognizes the library. ldconfig -p | grep libxxx # 3. Check whether LD_LIBRARY_PATH contains the directory. echo $LD_LIBRARY_PATH ``` If the library is in a nonstandard directory, set *LD_LIBRARY_PATH*, or add the directory to a configuration file under */etc/ld.so.conf.d/* and run **ldconfig** to update the cache. ## Check dependencies to resolve undefined symbols ```bash # List the library dependencies (safer than ldd because it does not execute code). readelf -d /path/to/libxxx.so | grep NEEDED # Check whether a symbol is defined in the library. nm -D /path/to/libxxx.so | grep " T " | grep symbol_name # Alternatively: readelf -s /path/to/libxxx.so | grep symbol_name ``` An undefined symbol usually indicates a library version mismatch or a missing dependency. If the symbol exists but the application still reports an error, the cause may be link order or ABI incompatibility. ## Check library version and ABI compatibility ```bash # Display the embedded library version string. strings /path/to/libxxx.so | grep -i version # Display the library SONAME. readelf -d /path/to/libxxx.so | grep SONAME ``` If the application was linked against libxxx.so.1 but only libxxx.so.2 is installed, an ABI change may cause a runtime crash even if the required symbol exists. A symbolic link, such as ln -s libxxx.so.2 libxxx.so.1, can be used as a temporary workaround. For a long-term solution, rebuild the application or install a compatible library version. ## Trace dynamic loading at runtime ```bash # 1. Display the libraries loaded by the dynamic linker. LD_DEBUG=libs ./your_app 2>&1 | grep libxxx # 2. Trace attempts to open library files. strace -e openat,open ./your_app 2>&1 | grep libxxx # 3. If the application crashes immediately, inspect it with gdb. gdb ./your_app (gdb) run (gdb) bt # Display the call stack after the crash. ``` # How can I update a third-party driver? 1. Obtain the official SDK. See [Image Build](<../../Operating System/Yocto Linux/Image Build/Image Build.md>) for download instructions. 2. Add the third-party driver source code under *sources/quectel-src/kernel*. 3. Add the device tree node for the peripheral to *sources/quectel-src/kernel/qcom-6.6/arch/arm64/boot/dts/qcom/qcs6490-idp-pi.dts*. 4. Build and flash the image, and then verify the driver. # What should I do if system performance is poor? Poor performance is usually caused by a combination of CPU scheduling, memory pressure, storage I/O, thermal throttling, and software configuration. ## Identify the bottleneck ```bash # 1. Display the 1-, 5-, and 15-minute load averages. uptime # A sustained load average greater than the number of CPU cores indicates CPU pressure. # 2. Display per-core CPU utilization by category (user, system, soft interrupt, and idle). mpstat -P ALL 1 3 # 3. Display memory and swap usage. free -h # Less than 10% available memory with nonzero swap usage indicates memory pressure. # 4. Check storage I/O. A %util value near 100% indicates a storage bottleneck. iostat -x 1 3 # 5. Check temperature and CPU frequency for thermal throttling. qpi-config dump temperature cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq ``` Interpret the key metrics as follows: - High `%us`: CPU-intensive user-space workload. - High `%sy`: Excessive system call or driver overhead. - High `%wa`: Storage I/O bottleneck. - High `%si`: Excessive software interrupts. - Temperature above 80 °C: Potential thermal throttling. - Very little `available` memory in **free -h**: Memory pressure. ## Apply targeted optimization ### CPU bottleneck (%us or %sy consistently above 60%) - Identify the processes with the highest CPU utilization. - Reduce the load generated by cameras and other peripherals. - Increase the real-time priority of critical threads, for example, by adjusting the scheduling policy. ### Memory bottleneck (very low available memory and nonzero swap usage) - Identify the ten processes with the highest memory usage. - Remove unnecessary log files. - Check for DMA-BUF or ION memory leaks. ### Storage I/O bottleneck (%util in iostat close to 100%) - Identify the processes generating the most write I/O. - Reduce unnecessary log writes. - Check for processes that write files too frequently. ### Thermal throttling (frequency reduction caused by high temperature) - Confirm whether the system has triggered frequency throttling. - Apply active physical or software cooling measures. # How can I configure a service to start at boot? `systemd` is the standard init system used by most mainstream Linux distributions, including Yocto-based systems. It provides dependency management, automatic restart, and environment variable configuration. ## Create a service unit file Create a `.service` file under */etc/systemd/system/*, for example, *my-camera.service*: ``` [Unit] Description=My Camera Service After=network.target # Start after the network is available. [Service] Type=simple # Other types include forking and oneshot. ExecStart=/usr/bin/my_script.sh Restart=on-failure # Restart automatically after a failure. User=root # Run as root. WorkingDirectory=/opt/my_app [Install] WantedBy=multi-user.target # Start when the system enters multi-user mode. ``` ## Enable and start the service ```bash # Reload the systemd configuration. sudo systemctl daemon-reload # Enable the service at boot. sudo systemctl enable my-camera.service # Start the service immediately, if required. sudo systemctl start my-camera.service # Display the service status. sudo systemctl status my-camera.service ``` # How can I install a third-party driver? 1. Obtain the driver module: Obtain the third-party driver source code and cross-compile it in an environment that matches the development board's kernel version to generate a .ko module. 2. Transfer the driver module: Transfer the compiled .ko file to the development board through scp, adb, or a USB flash drive. 3. Load and unload the driver: Load the driver with **insmod**: ```bash insmod your_driver.ko ``` Unload the driver with **rmmod**: ```bash rmmod your_driver ``` Run **lsmod** to list all loaded modules: ``` lsmod ``` # What should I do if no solution is available? 1. Visit the [Quectel FAQ page](). 2. Ask a question on the [Quectel Developer Forum]().